﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using static MyGreedySnake.Direction;

namespace MyGreedySnake
{
    public partial class Form1 : Form
    {
        private int difficultLevel =0;
        static MDirection direction = Direction.MDirection.right;
        static bool gameover = false;
        private BasicBlock food;
        private BasicBlock head;
        private List<BasicBlock> bodies = new List<BasicBlock>();
        BasicPane pane;
        List<Image> headImgs = new List<Image>();
        ThreadStart threadStart = null;
        Thread thread = null;
        public Form1()
        {
            InitializeComponent();
            pane = new BasicPane();
            this.Controls.Add(pane);
            pane.Dock = DockStyle.Fill;

            this.FormBorderStyle = FormBorderStyle.None;
            this.Size = new Size(1000, 800);
            this.Opacity = 0.5;
            this.ControlBox = false;
            this.BackgroundImage = Image.FromFile(@"Image\背景.png");
            Image image = Image.FromFile(@"Image\红心.jpg");
            food = new BasicBlock(100, 100, image);
            pane.Controls.Add(food);

            image = Image.FromFile(@"Image\蛇头1.png");
            headImgs.Add(image);
            head = new BasicBlock(500, 400, image);
            image = Image.FromFile(@"Image\蛇头2.png");
            headImgs.Add(image);
            image = Image.FromFile(@"Image\蛇头3.png");
            headImgs.Add(image);
            image = Image.FromFile(@"Image\蛇头4.png");
            headImgs.Add(image);
            bodies.Add(head);
            pane.Controls.Add(head);

            ReFreshFoodPos();

            //创建线程和委托
            threadStart = new ThreadStart(Move);
            thread = new Thread(threadStart);
            thread.IsBackground = true;

            thread.Start();
        }

       private bool CheckGameOver()
        {
            bool gameover = false;
            if (head.Location.X < 0 || head.Location.X > 990 || head.Location.Y < 0 || head.Location.Y > 790)
                gameover = true;
            if (bodies.Count > 1)
            {
                for(int i = 1; i <bodies.Count;i++)
                {
                    if (head.Location == bodies[i].Location)
                        gameover = true;
                }
            }
            return gameover;
        }
         private void ReFreshFoodPos()
        {
            Random random = new Random();
            bool validPosition = false;
            int x = random.Next(10, 990);
            int y = random.Next(10, 790);
            while (!validPosition)
            {
                validPosition = true;
                foreach(var item in bodies)
                {
                    if(x == item.Location.X && y == item.Location.Y)
                    {
                        validPosition = false;
                        break;
                    }
                }
            }
            food.Location = new Point(x, y);
        }

        public void Move()
        {
            while(!gameover)
            {
                int x = head.Location.X;
                int y = head.Location.Y;    
                head.move();
                if (!CheckEaten(x,y))
                {
                    if (bodies.Count > 1)
                    {
                        for (int i = bodies.Count; i > 0; i--)
                        {
                            if (i != 1)
                            {
                                bodies[i - 1].Location = bodies[i - 2].Location;
                                bodies[i - 1].direction = bodies[i - 2].direction;
                            }
                            else
                            {
                                bodies[1].Location = new Point(x, y);
                                bodies[1].direction = head.direction;
                            }

                        }
                    }
                }
                int time = 0;
                if (difficultLevel == 0)
                    time = 200;
                Thread.Sleep(time);
                gameover = CheckGameOver();
            }
            if (gameover)
            {
                DialogResult resault = MessageBox.Show("You Failed!","Information",MessageBoxButtons.OK);
                if(resault == DialogResult.OK)
                    this.Close();
            }
        }
        public bool CheckEaten(int x, int y)
        {
            bool eaten = false;
            if(Math.Abs(head.Location.X - food.Location.X) < 20 && Math.Abs(head.Location.Y - food.Location.Y) < 20)
            {
                Image image = Image.FromFile(@"Image\方块.jpg");
                BasicBlock body = new BasicBlock(x, y, image);
                body.direction = head.direction;
                this.pane.Invoke((MethodInvoker)delegate { AddObjectToForm(body); });
                eaten = true;
            }
            return eaten;
        }

        private void AddObjectToForm(object myObject)
        {
            // 将对象添加到UI控件中
            this.pane.Controls.Add(myObject as BasicBlock);
            bodies.Insert(1,myObject as BasicBlock);
            ReFreshFoodPos();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {

            BasicBlock item = null;
            if (bodies.Count > 1)
                item = bodies[1];
            switch(e.KeyCode)
            {
                case Keys.Right:
                    if (item == null || item.direction != MDirection.left)
                    {
                        head.direction = MDirection.right;
                        head.BackgroundImage = headImgs[0];
                    }
                    break;
                case Keys.Left:
                    if (item == null || item.direction != MDirection.right)
                    {
                        head.direction = MDirection.left;
                        head.BackgroundImage = headImgs[2];
                    }
                    break;
                case Keys.Up:
                    if (item == null || item.direction != MDirection.down)
                    {
                        head.direction = MDirection.up;
                        head.BackgroundImage = headImgs[3];
                    }
                    break;
                case Keys.Down:
                    if (item == null || item.direction != MDirection.up)
                    {
                        head.direction = MDirection.down;
                        head.BackgroundImage = headImgs[1];
                    }
                    break;
                default:
                    break;
            }
        }
    }
}
